09.Python之路 - 字符编码

Python之路 - 字符编码

介绍 🍀

字符编码

字符编码 (Character encoding) 也称字集码 , 它是一套法则 , 使用该法则能够对自然语言的字符的一个集合 (如字母表或音节表) , 与其他东西的一个集合 (如号码或电脉冲) 进行配对 , 即在符号集合与数字系统之间建立对应关系

再简单一点说其实就是一张具有对应关系的表格 , 如下

1
2
3
4
5
6
7
+----+-----------+
| id | character |
+----+-----------+
| 65 | A |
| 66 | B |
| 67 | C |
+----+-----------+

如上表所示 , 这就是一套法则 , 使我们用数字成功的表示了字符

为什么要一套这样的法则 ?

众所周知 , 计算机只认识机器码 , 也就是一堆0101之类的二进制数字 , 计算机并不认识我们的 “A” , “B” ,”C” , 我们为了使其友好的显示 , 就需要一套这样的法则 , 来完成这些转换 , 于是两个名词诞生了

编码

通俗的说 , 就是按照何种规则将字符存储在计算机中 . 比如 “A” 用65表示 , 也就是把字符”A”以二进制的方式存储在计算机中

解码

反之 , 将存储在计算机中的二进制数解析显示出来 , 这就是解码

在Python中

1
2
3
4
5
6
7
'''既然是对于字符,那么自然对应着Python中的字符串了'''
'''Python中提供了两个函数来完成编码和解码'''
# 编码函数encode()
encode()
character → byte
# 解码函数decode()
byte → character

PS : 必须采用相对应的法则 , 否则就会出错 , 也就是我们常说的乱码

最后还有一个名词 , 字符集

字符集

是一个系统支持的所有抽象字符的集合 , 字符是各种文字和符号的总称 , 包括各国家文字、标点符号、图形符号、数字等

字符编码就是在字符集与数字系统之间建立的对应关系

ASCII 🍀

ASCII (American Standard Code for Information Interchange , 美国信息交换标准码) , 是基于拉丁字母的一套电脑编码系统 , 主要用于显示现代英语

ASCII字符集 : 主要包括控制字符 (回车键 , 退格 , 换行键等) , 可显示字符 (英文大小写字符 , 阿拉伯数字和西文符号)

ASCII编码 : 将ASCII字符集转换为计算机可以接收的数字系统的数的规则 , 使用7位(Bit)表示一个字符 , 1 Byte = 8 Bit , 一共可以表示128(2的7次方)个字符

具体ASCII字符集映射到数字编码规则可以自行查询

ANSI 🍀

ANSI编码为在ASCII编码(7位)的基础上 , 将其最后一位也使用上 , 即使用8位

ANSI使使计算机支持更多语言 , 通常对于没超过128的即用ASCII编码 , 超过的即用扩展的ASCII编码ANSI

当然不同的国家和地区指定了不同的标准 , 由此产生了GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准

在简体中文Windows操作系统中 , ANSI 编码代表 GBK 编码 ; 在繁体中文Windows操作系统中 , ANSI编码代表Big5 ; 在日文Windows操作系统中 , ANSI 编码代表 Shift_JIS 编码

GBXXX 🍀

GB2312编码

计算机发明之初及后面很长一段时间 , 只应用于美国及西方一些发达国家 , 于是到中国时 , 一个字节8位 , 256个字符是远远不能满足的 , 要想想中国有多少汉字 , 于是聪明的中国人这样规定 :

一个小于127的字符的意义与原来相同 , 但是两个大于127的字符连在一起时 , 就表示一个汉字 , 前面的一个字节称为高字节 , 后面的为低字节 , 这样就组合出了大约7000多个简体汉字了 , 这就是GB2312 ,全称 信息交换用汉字编码字符集 ▪ 基本集

GB18030

由于7000多个汉字还是不够用 , 于是继续改进 , 每个汉字可以由1个 , 2个或4个字节组成 , 于是庞大的编码空间形成了 , 最多可以定义161万个字符 , 这就是GB18030 , 全称 信息技术中文编码字符集

Unicode 🍀

各种各样的字符编码都出来了 , 大家各用各的 , 那么问题就来了 , 一旦出现在网络上 , 由于不兼容 , 互相访问就出现了乱码现象 , 为了解决这个问题 , Unicode编码系统应运而生

Unicode编码系统为表达任意语言的任意字符而设计 , 它使用2字节的数字来表达每个字母 , 符号 , 或者表意文字 , 每个数字代表唯一的至少在某种语言中使用的符号 (并不是所有的数字都用上了 , 但是总数已经超过了65535 所以2个字节的数字是不够用的)

总而言之 , Unicode是业界的一种标准 , 也叫做统一码 , 万国码 , 单一码 , 标准万国码

所以Unicode编码也成为了一个编码转换的基础 , 因为大家都支持他 , 从一种编码到另一中编码 , 只需要Unicode在中间搭桥就能简单的实现了

UTF - 8

对于Unicode来讲 , 任何字符都使用2个字节来存储 , 这明显是很浪费内存的 , 因为我们编写代码时 , 用到中文毕竟极少 , 所以为了节省内存 , 就有了UTF-8 , UTF - 8规定 , 英文只使用1个字节 , 中文使用3个字节

虽然说UTF - 8具有良好的国际兼容性 , 但中文需要比GBK/BIG5版本多占用50%的数据库存储空间 , 因此并不推荐使用

Python编码处理 🍀

在Python3中 , 源代码读取进行语法校验时 , 会将源代码中的字符串从声明的编码转换成Unicode类型 , 等到语法校验通过后 , 再将这些字符换回初始的编码 , 这也就是说 , Python3中 , 字符串默认编码就是Unicode , 这也是Python受欢迎的原因之一

查看默认编码

1
2
>>> import sys
>>> sys.getdefaultencoding()

PS : Windows下命令行的字符编码默认是GBK ; 并且Python2中 , 字符串是有两种类型的 , 这里不多说明

关于Python 2.x 与Python 3.x中乱码处理见后续文章

编码,解码练习

本文标题:09.Python之路 - 字符编码

文章作者:Jesse

发布时间:2020年05月27日 - 22:05

最后更新:2020年06月30日 - 20:06

原始链接:https://jesse.top/2020/05/27/python/01-basic/09-Python之路 - 字符编码/

许可协议: 禁止商业用途 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!